#pragma once

#include <iostream>

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h> // 网络通信
#include <arpa/inet.h>

#include "Common.hpp"

class InetAddr
{
private:
	void PortNet_to_Host()
	{
		_port = ::ntohs(_net_addr.sin_port);
	}
	void IpNet_to_Host()
	{
		char ipbuffer[64];
		const char *ip = ::inet_ntop(AF_INET, &_net_addr.sin_addr, ipbuffer, sizeof(ipbuffer));
		(void)ip;
		_ip = ipbuffer;
	}

public:
	InetAddr()
	{
	}
	InetAddr(const struct sockaddr_in &addr)
		: _net_addr(addr)
	{
		PortNet_to_Host();
		IpNet_to_Host();
	}
	InetAddr(uint16_t port)
		: _port(port), _ip("")
	{
		_net_addr.sin_family = AF_INET;
		_net_addr.sin_port = htons(_port);
		_net_addr.sin_addr.s_addr = INADDR_ANY;
	}
	bool operator==(const InetAddr &addr)
	{
		return _ip == addr._ip;
	}

	struct sockaddr *NetAddr()
	{
		return CONV(&_net_addr);
	}
	socklen_t NetAddrLen()
	{
		return sizeof(_net_addr);
	}
	std::string Ip()
	{
		return _ip;
	}
	uint16_t Port()
	{
		return _port;
	}
	std::string Addr()
	{
		return Ip() + ":" + std::to_string(Port());
	}
	~InetAddr()
	{
	}

private:
	struct sockaddr_in _net_addr;
	std::string _ip;
	uint16_t _port;
};